package com.cskaoyan.javase._1interface._4example.operation.impl;

import com.cskaoyan.javase._1interface._4example.model.Goods;
import com.cskaoyan.javase._1interface._4example.model.GoodsData;
import com.cskaoyan.javase._1interface._4example.operation.IOperation;

/**
 * 实现商品操作接口,实现商品操作
 * 这里要想对商品做操作,需要依赖于数据源
 *
 * @since 15:12
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class IOperationImpl implements IOperation {
    private Goods[] goods = GoodsData.GS;

    /**
     * 从数组源中查找真实对象,封装成一个数组然后返回
     * @return com.cskaoyan.javase._1interface._4example.model.Goods[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/04/22 15:14
     */
    @Override
    public Goods[] getAllRealGoods() {
        /*
            这里需要将数据源中的null元素全部去掉
            返回一个只装有真实对象的数组
            这个需求可以直接在原数组上完成吗?
            显然不行,需要创建新数组,然后返回
            新数组的长度 = 老数组的长度 - null元素的个数
            所以需要计数器
         */
        int count = 0;
        for (Goods good : goods) {
            if (good == null) {
                count++;
            }
        }
        // count就是源数组中null元素的个数
        Goods[] result = new Goods[goods.length - count];
        // 遍历老数组,过滤掉null元素,然后赋值
        // 需要一个新数组的下标
        int newIndex = 0;
        for (Goods good : goods) {
            if (good == null) {
                continue;
            }
            result[newIndex] = good;
            newIndex++;
        }
        return result;
    }

    /**
     * 方法返回值:
     * 0 表示插入成功
     * 1 表示id不合法,id重复不合法,id小于等于0也不合法
     * 2 表示数组已满
     *
     * @param g 被插入数组源的一条商品信息
     * @return int
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/04/22 15:47
     */
    @Override
    public int insertGoods(Goods g) {
        int idInput = g.getId();
        // 先校验id是否合法
        if (idInput <= 0) {
            // 不合法
            return 1;
        }
        // 校验id是否重复
        for (Goods real : getAllRealGoods()) {
            if (real.getId() == idInput) {
                // id重复
                return 1;
            }
        }
        // 代码运行到这里,id一定大于0,并且id一定不重复,id一定合法,可以插入
        // 遍历数据源,查找null的位置,将方法的参数赋值给它
        for (int i = 0; i < goods.length; i++) {
            if (goods[i] == null) {
                // 有位置,就赋值
                // 插入成功
                goods[i] = g;
                return 0;
            }
        }
        // 遍历完数组,都没有插入成功,说明没有找到null元素,说明数组满了
        return 2;
    }

    /**
     * 遍历数据源,找到id后,将该位置赋值为null
     * 表示删除成功 返回true
     * 没有找到id对应的商品,删除失败,返回false
     *
     * @param id 被删除的商品id
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/04/22 16:00
     */
    @Override
    public boolean deleteGoods(int id) {
        for (int i = 0; i < goods.length; i++) {
            // 判断null 避免空指针异常
            if (goods[i] == null){
                continue;
            }
            if (goods[i].getId() == id){
                // 找到了,该元素
                goods[i] = null;
                return true;
            }
        }
        return false;
    }
}
